package main

import "fmt"

func main() {
	/*
		对于带 defer 的函数返回整体上有三个步骤：
		（1）执行 return 的值拷贝，将 return 语句返回的值复制到函数返回值栈区（如果只有一个return，不带任何变量或值，则此步骤不做任何动作）
		（2）执行 defer 语句，多个 defer 按照 FILO 顺序执行
		（3）执行调整 RET 指令

		注：在实际编程中应该尽量避免在 defer 中修改函数返回值
			在定义函数时使用不带返回值名的格式
	*/
	fmt.Println("f4=", f4()) //f4= 0
	fmt.Println("f5=", f5()) //f5= 0
}

//以下是正确的样例：

func f4() int {
	r := 0
	defer func() {
		r++
	}()

	return r
}

func f5() int {
	r := 0
	defer func(i int) {
		i++
	}(r)

	return 0
}
